TypeScriptã®Partialåã¯ãããããã£ããªãã·ã§ãã«ã«ãããªããžã§ã¯ãæäœãç°¡çŽ åããŠã³ãŒãã®ä¿å®æ§ãé«ãã匷åãªæ©èœã§ããå®è·µäŸãšãã¹ããã©ã¯ãã£ã¹ã§æ¢æ±ããŸãã
TypeScriptã®Partialåããã¹ã¿ãŒããïŒããããã£ã倿ããŠæè»æ§ãé«ãã
JavaScriptã®ã¹ãŒããŒã»ããã§ããTypeScriptã¯ãåçãªãŠã§ãéçºã®äžçã«éçåä»ãããããããŸãããã®åŒ·åãªæ©èœã®1ã€ãPartial
åã§ãããã«ããæ¢åã®åã®ãã¹ãŠã®ããããã£ããªãã·ã§ãã«ãªåãäœæã§ããŸãããã®æ©èœã¯ãããŒã¿ããªããžã§ã¯ãæäœãAPIãšã®ããåããæ±ãéã«ãæè»æ§ã®äžçãåãéããŸãããã®èšäºã§ã¯ãPartial
åãæ·±ãæãäžããTypeScriptãããžã§ã¯ãã§å¹æçã«æŽ»çšããããã®å®è·µçãªäŸãšãã¹ããã©ã¯ãã£ã¹ãæäŸããŸãã
TypeScriptã®Partialåãšã¯ïŒ
Partial<T>
åã¯ãTypeScriptã«çµã¿èŸŒãŸãããŠãŒãã£ãªãã£åã§ãããžã§ããªãã¯åŒæ°ãšããŠåT
ãåãåããT
ã®ãã¹ãŠã®ããããã£ããªãã·ã§ãã«ã«ãªã£ãæ°ããåãè¿ããŸããæ¬è³ªçã«ããã¹ãŠã®ããããã£ãrequired
ïŒå¿
é ïŒããoptional
ïŒä»»æïŒã«å€æããŸããã€ãŸãããã®åã®ãªããžã§ã¯ããäœæããéã«ãå¿
ãããããããã£ãååšããŠããå¿
èŠã¯ãããŸããã
次ã®äŸãèããŠã¿ãŸãããïŒ
interface User {
id: number;
name: string;
email: string;
country: string;
}
const user: User = {
id: 123,
name: "Alice",
email: "alice@example.com",
country: "USA",
};
次ã«ãUser
åã®Partial
ããŒãžã§ã³ãäœæããŠã¿ãŸãããïŒ
type PartialUser = Partial<User>;
const partialUser: PartialUser = {
name: "Bob",
};
const anotherPartialUser: PartialUser = {
id: 456,
email: "bob@example.com",
};
const emptyUser: PartialUser = {}; // æå¹
ãã®äŸã§ã¯ãPartialUser
ã¯ããããã£id?
ãname?
ãemail?
ãcountry?
ãæã¡ãŸããããã¯ããããã®ããããã£ã®ä»»æã®çµã¿åããïŒãŸã£ãããªãå Žåãå«ãïŒã§PartialUser
åã®ãªããžã§ã¯ããäœæã§ããããšãæå³ããŸããemptyUser
ã®ä»£å
¥ã¯ããã瀺ããŠãããPartial
ã®éèŠãªåŽé¢ãã€ãŸããã¹ãŠã®ããããã£ããªãã·ã§ãã«ã«ããç¹ã匷調ããŠããŸãã
Partialåã䜿çšããçç±
Partial
åã¯ãããã€ãã®ã·ããªãªã§åœ¹ç«ã¡ãŸãïŒ
- ãªããžã§ã¯ãã®æ®µéçãªæŽæ°ïŒ æ¢åã®ãªããžã§ã¯ããæŽæ°ããéããã®ããããã£ã®äžéšã ãã倿ŽãããããšããããããŸãã
Partial
ã䜿çšãããšã倿Žãããããããã£ã®ã¿ãå«ãæŽæ°ãã€ããŒããå®çŸ©ã§ããŸãã - ãªãã·ã§ãã«ãªãã©ã¡ãŒã¿ïŒ 颿°ã®ãã©ã¡ãŒã¿ã§
Partial
ã䜿çšãããšãç¹å®ã®ãã©ã¡ãŒã¿ããªãã·ã§ãã«ã«ã§ãã颿°ã®åŒã³åºãæ¹ã«å€§ããªæè»æ§ããããããŸãã - ãªããžã§ã¯ãã®æ®µéçãªæ§ç¯ïŒ è€éãªãªããžã§ã¯ããæ§ç¯ããéãäžåºŠã«ãã¹ãŠã®ããŒã¿ãå©çšå¯èœã§ãããšã¯éããŸããã
Partial
ã䜿çšãããšããªããžã§ã¯ããå°ããã€æ§ç¯ã§ããŸãã - APIãšã®é£æºïŒ APIã¯ãç¹å®ã®ãã£ãŒã«ããæ¬ èœããŠãããnullã§ãã£ããããããŒã¿ãè¿ãããšããããããŸãã
Partial
ã¯ãå³å¯ãªå匷å¶ãªãã«ããããã®ç¶æ³ãåªé ã«åŠçããã®ã«åœ¹ç«ã¡ãŸãã
Partialåã®å®è·µçãªäŸ
1. ãŠãŒã¶ãŒãããã¡ã€ã«ã®æŽæ°
ãŠãŒã¶ãŒã®ãããã¡ã€ã«ãæŽæ°ãã颿°ããããšæ³åããŠãã ããããã®é¢æ°ãæ¯åãã¹ãŠã®ãŠãŒã¶ãŒããããã£ãåãåãããšãèŠæ±ããã®ã§ã¯ãªããç¹å®ã®ãã£ãŒã«ãã®æŽæ°ãèš±å¯ãããå Žåã§ãã
interface UserProfile {
firstName: string;
lastName: string;
age: number;
country: string;
occupation: string;
}
function updateUserProfile(userId: number, updates: Partial<UserProfile>): void {
// ããŒã¿ããŒã¹ã§ãŠãŒã¶ãŒãããã¡ã€ã«ãæŽæ°ããã·ãã¥ã¬ãŒã·ã§ã³
console.log(`ãŠãŒã¶ãŒ ${userId} ãæŽæ°äž:`, updates);
}
updateUserProfile(1, { firstName: "David" });
updateUserProfile(2, { lastName: "Smith", age: 35 });
updateUserProfile(3, { country: "Canada", occupation: "Software Engineer" });
ãã®å ŽåãPartial<UserProfile>
ã«ãããåãšã©ãŒãçºçãããããšãªããæŽæ°ãå¿
èŠãªããããã£ã®ã¿ãæž¡ãããšãã§ããŸãã
2. APIãªã¯ãšã¹ããªããžã§ã¯ãã®æ§ç¯
APIãªã¯ãšã¹ããè¡ãéããªãã·ã§ãã«ãªãã©ã¡ãŒã¿ãããå ŽåããããŸããPartial
ã䜿çšãããšããªã¯ãšã¹ããªããžã§ã¯ãã®äœæãç°¡çŽ åã§ããŸãã
interface SearchParams {
query: string;
category?: string;
location?: string;
page?: number;
pageSize?: number;
}
function searchItems(params: Partial<SearchParams>): void {
// APIåŒã³åºãã®ã·ãã¥ã¬ãŒã·ã§ã³
console.log("æ€çŽ¢ãã©ã¡ãŒã¿:", params);
}
searchItems({ query: "laptop" });
searchItems({ query: "phone", category: "electronics" });
searchItems({ query: "book", location: "London", page: 2 });
ããã§ã¯ãSearchParams
ãå¯èœãªæ€çŽ¢ãã©ã¡ãŒã¿ãå®çŸ©ããŠããŸããPartial<SearchParams>
ã䜿çšããããšã§ãå¿
èŠãªãã©ã¡ãŒã¿ã®ã¿ãæã€ãªã¯ãšã¹ããªããžã§ã¯ããäœæã§ãã颿°ãããå€ç®çã«äœ¿çšã§ããŸãã
3. ãã©ãŒã ãªããžã§ã¯ãã®äœæ
ãã©ãŒã ãç¹ã«è€æ°ã¹ãããã®ãã©ãŒã ãæ±ãéãPartial
ã®äœ¿çšã¯éåžžã«äŸ¿å©ã§ãããã©ãŒã ããŒã¿ãPartial
ãªããžã§ã¯ããšããŠè¡šçŸãããŠãŒã¶ãŒããã©ãŒã ã«å
¥åããã«ã€ããŠæ®µéçã«ããŒã¿ãåããŠããããšãã§ããŸãã
interface AddressForm {
street: string;
city: string;
postalCode: string;
country: string;
}
let form: Partial<AddressForm> = {};
form.street = "123 Main St";
form.city = "Anytown";
form.postalCode = "12345";
form.country = "USA";
console.log("ãã©ãŒã ããŒã¿:", form);
ãã®ã¢ãããŒãã¯ããã©ãŒã ãè€éã§ããŠãŒã¶ãŒãäžåºŠã«ãã¹ãŠã®ãã£ãŒã«ããå ¥åããªãå Žåã«åœ¹ç«ã¡ãŸãã
Partialãšä»ã®ãŠãŒãã£ãªãã£åãšã®çµã¿åãã
Partial
ã¯ãä»ã®TypeScriptãŠãŒãã£ãªãã£åãšçµã¿åãããŠãããè€éã§ã«ã¹ã¿ãã€ãºãããå倿ãäœæã§ããŸããããã€ãã®æçšãªçµã¿åããã«ã¯ã次ã®ãã®ããããŸãïŒ
Partial<Pick<T, K>>
: ç¹å®ã®ããããã£ããªãã·ã§ãã«ã«ããŸããPick<T, K>
ã¯T
ããããããã£ã®ãµãã»ãããéžæãããã®åŸPartial
ããããã®éžæãããããããã£ããªãã·ã§ãã«ã«ããŸããRequired<Partial<T>>
: äžèŠçŽæã«åããããã«èŠããŸãããããã¯ãªããžã§ã¯ããã宿ããããšãã«ãã¹ãŠã®ããããã£ãååšããããšã確èªãããã·ããªãªã§åœ¹ç«ã¡ãŸãããªããžã§ã¯ããæ§ç¯äžã¯Partial<T>
ã§å§ããä¿åãŸãã¯åŠçããåã«ãã¹ãŠã®ãã£ãŒã«ããå ¥åãããããšãæ€èšŒããããã«Required<Partial<T>>
ã䜿çšããŸããReadonly<Partial<T>>
: ãã¹ãŠã®ããããã£ããªãã·ã§ãã«ãã€èªã¿åãå°çšã§ããåãäœæããŸããããã¯ãéšåçã«ããŒã¿ãå ¥åã§ããããåæäœæåŸã¯å€æŽãã¹ãã§ã¯ãªããªããžã§ã¯ããå®çŸ©ããå¿ èŠãããå Žåã«æçã§ãã
äŸïŒPartialãšPickã®çµã¿åãã
æŽæ°æã«User
ã®ç¹å®ã®ããããã£ã®ã¿ããªãã·ã§ãã«ã«ããããšããŸãããã®å ŽåãPartial<Pick<User, 'name' | 'email'>>
ã䜿çšã§ããŸãã
interface User {
id: number;
name: string;
email: string;
country: string;
}
type NameEmailUpdate = Partial<Pick<User, 'name' | 'email'>>;
const update: NameEmailUpdate = {
name: "Charlie",
// countryã¯ããã§ã¯èš±å¯ãããŸãããnameãšemailã®ã¿ã§ã
};
const update2: NameEmailUpdate = {
email: "charlie@example.com"
};
Partialåã䜿çšããéã®ãã¹ããã©ã¯ãã£ã¹
- 泚æããŠäœ¿çšããïŒ
Partial
ã¯æè»æ§ãæäŸããŸããã䜿ãããããšåãã§ãã¯ãç·©ããªããæœåšçãªã©ã³ã¿ã€ã ãšã©ãŒã«ã€ãªããå¯èœæ§ããããŸããæ¬åœã«ãªãã·ã§ãã«ãªããããã£ãå¿ èŠãªå Žåã«ã®ã¿äœ¿çšããŠãã ããã - ä»£æ¿æ¡ãæ€èšããïŒ
Partial
ã䜿çšããåã«ããŠããªã³åãã€ã³ã¿ãŒãã§ãŒã¹ã§çŽæ¥å®çŸ©ããããªãã·ã§ãã«ããããã£ãªã©ãä»ã®ææ³ãããé©åã§ãªããè©äŸ¡ããŠãã ããã - æç¢ºã«ææžåããïŒ
Partial
ã䜿çšããéã¯ããªãããã䜿çšããŠããã®ããã©ã®ããããã£ããªãã·ã§ãã«ã§ããããšãæåŸ ãããã®ããæç¢ºã«ææžåããŠãã ãããããã«ãããä»ã®éçºè ãæå³ãçè§£ãã誀çšãé¿ããã®ã«åœ¹ç«ã¡ãŸãã - ããŒã¿ãæ€èšŒããïŒ
Partial
ã¯ããããã£ããªãã·ã§ãã«ã«ãããããäºæããªãåäœãé²ãããã«äœ¿çšããåã«ããŒã¿ãæ€èšŒããŠãã ãããå¿ èŠã«å¿ããŠãåã¬ãŒããã©ã³ã¿ã€ã ãã§ãã¯ã䜿çšããŠãå¿ é ããããã£ãååšããããšã確èªããŠãã ããã - ãã«ããŒãã¿ãŒã³ã®äœ¿çšãæ€èšããïŒ è€éãªãªããžã§ã¯ãäœæã«ã¯ããã«ããŒãã¿ãŒã³ã䜿çšããŠãªããžã§ã¯ããäœæããããšãæ€èšããŠãã ãããããã¯ã`Partial`ã䜿çšããŠãªããžã§ã¯ããæ®µéçã«æ§ç¯ããããããæç¢ºã§ä¿å®æ§ã®é«ãä»£æ¿æ¡ãšãªãããšãå€ãã§ãã
ã°ããŒãã«ãªèæ ®äºé ãšäŸ
ã°ããŒãã«ãªã¢ããªã±ãŒã·ã§ã³ãæ±ãéã«ã¯ãç°ãªãå°åãæåçèæ¯ã«ãããŠPartial
åãã©ã®ããã«å¹æçã«äœ¿çšã§ããããèæ
®ããããšãäžå¯æ¬ ã§ãã
äŸïŒåœéçãªäœæãã©ãŒã
äœæã®åœ¢åŒã¯åœã«ãã£ãŠå€§ããç°ãªããŸããç¹å®ã®äœæã³ã³ããŒãã³ããå¿
èŠãšããåœãããã°ãç°ãªãéµäŸ¿çªå·ã·ã¹ãã ã䜿çšããåœããããŸããPartial
ã䜿çšããããšã§ããããã®ããªãšãŒã·ã§ã³ã«å¯Ÿå¿ã§ããŸãã
interface InternationalAddress {
streetAddress: string;
apartmentNumber?: string; // äžéšã®åœã§ã¯ãªãã·ã§ãã«
city: string;
region?: string; // éœéåºçãå·ãªã©
postalCode: string;
country: string;
addressFormat?: string; // åœã«åºã¥ããŠè¡šç€ºåœ¢åŒãæå®ãããã
}
function formatAddress(address: InternationalAddress): string {
let formattedAddress = "";
switch (address.addressFormat) {
case "UK":
formattedAddress = `${address.streetAddress}\n${address.city}\n${address.postalCode}\n${address.country}`;
break;
case "USA":
formattedAddress = `${address.streetAddress}\n${address.city}, ${address.region} ${address.postalCode}\n${address.country}`;
break;
case "Japan":
formattedAddress = `${address.postalCode}\n${address.region}${address.city}\n${address.streetAddress}\n${address.country}`;
break;
default:
formattedAddress = `${address.streetAddress}\n${address.city}\n${address.postalCode}\n${address.country}`;
}
return formattedAddress;
}
const ukAddress: Partial<InternationalAddress> = {
streetAddress: "10 Downing Street",
city: "London",
postalCode: "SW1A 2AA",
country: "United Kingdom",
addressFormat: "UK"
};
const usaAddress: Partial<InternationalAddress> = {
streetAddress: "1600 Pennsylvania Avenue NW",
city: "Washington",
region: "DC",
postalCode: "20500",
country: "USA",
addressFormat: "USA"
};
console.log("UK Address:\n", formatAddress(ukAddress as InternationalAddress));
console.log("USA Address:\n", formatAddress(usaAddress as InternationalAddress));
InternationalAddress
ã€ã³ã¿ãŒãã§ãŒã¹ã¯ãäžçäžã®ããŸããŸãªäœæåœ¢åŒã«å¯Ÿå¿ãããããapartmentNumber
ãregion
ã®ãããªãªãã·ã§ãã«ãªãã£ãŒã«ãã蚱容ããŸããaddressFormat
ãã£ãŒã«ãã¯ãåœã«åºã¥ããŠäœæã®è¡šç€ºæ¹æ³ãã«ã¹ã¿ãã€ãºããããã«äœ¿çšã§ããŸãã
äŸïŒç°ãªãå°åã«ããããŠãŒã¶ãŒèšå®
ãŠãŒã¶ãŒèšå®ã¯å°åã«ãã£ãŠç°ãªãå ŽåããããŸããäžéšã®èšå®ã¯ãç¹å®ã®åœãæåã§ã®ã¿é¢é£æ§ããããããããŸããã
interface UserPreferences {
darkMode: boolean;
language: string;
currency: string;
timeZone: string;
pushNotificationsEnabled: boolean;
smsNotificationsEnabled?: boolean; // äžéšã®å°åã§ã¯ãªãã·ã§ãã«
marketingEmailsEnabled?: boolean;
regionSpecificPreference?: any; // æè»ãªå°ååºæã®èšå®
}
function updateUserPreferences(userId: number, preferences: Partial<UserPreferences>): void {
// ããŒã¿ããŒã¹ã§ãŠãŒã¶ãŒèšå®ãæŽæ°ããã·ãã¥ã¬ãŒã·ã§ã³
console.log(`ãŠãŒã¶ãŒ ${userId} ã®èšå®ãæŽæ°äž:`, preferences);
}
updateUserPreferences(1, {
darkMode: true,
language: "en-US",
currency: "USD",
timeZone: "America/Los_Angeles"
});
updateUserPreferences(2, {
darkMode: false,
language: "fr-CA",
currency: "CAD",
timeZone: "America/Toronto",
smsNotificationsEnabled: true // ã«ããã§ã¯æå¹
});
UserPreferences
ã€ã³ã¿ãŒãã§ãŒã¹ã¯ãsmsNotificationsEnabled
ãmarketingEmailsEnabled
ã®ãããªãªãã·ã§ãã«ãªããããã£ã䜿çšããŠããããããã¯ç¹å®ã®å°åã§ã®ã¿é¢é£æ§ããããããããŸãããregionSpecificPreference
ãã£ãŒã«ãã¯ãå°ååºæã®èšå®ã远å ããããã®ãããªãæè»æ§ãæäŸããŸãã
çµè«
TypeScriptã®Partial
åã¯ãæè»ã§ä¿å®æ§ã®é«ãã³ãŒããäœæããããã®å€ç®çãªããŒã«ã§ãããªãã·ã§ãã«ãªããããã£ãå®çŸ©ã§ããããã«ããããšã§ããªããžã§ã¯ãæäœãAPIãšã®ããåããããŒã¿ãã³ããªã³ã°ãç°¡çŽ åããŸããPartial
ã广çã«äœ¿çšããæ¹æ³ãšãä»ã®ãŠãŒãã£ãªãã£åãšã®çµã¿åãããçè§£ããããšã§ãTypeScriptéçºã®ã¯ãŒã¯ãããŒã倧å¹
ã«åäžãããããšãã§ããŸããæ
éã«äœ¿çšãããã®ç®çãæç¢ºã«ææžåããæœåšçãªèœãšã穎ãé¿ããããã«ããŒã¿ãæ€èšŒããããšãå¿ããªãã§ãã ãããã°ããŒãã«ãªã¢ããªã±ãŒã·ã§ã³ãéçºããéã«ã¯ãç°ãªãå°åãæåã®å€æ§ãªèŠä»¶ãèæ
®ããPartial
åãæŽ»çšããŠé©å¿æ§ãé«ããŠãŒã¶ãŒãã¬ã³ããªãŒãªãœãªã¥ãŒã·ã§ã³ãæ§ç¯ããŠãã ãããPartial
åããã¹ã¿ãŒããããšã§ãããŸããŸãªã·ããªãªãåªé
ãã€æ£ç¢ºã«åŠçã§ãããããå
ç¢ã§é©å¿æ§ãé«ããä¿å®æ§ã®é«ãTypeScriptã³ãŒããæžãããšãã§ããŸãã